#include <stdarg.h>
#include <linux/printk.h>
#include <linux/sprintf.h>
#include <linux/console.h>
#include <linux/hlist.h>
#include <linux/rculist.h>

static int preferred_console = -1;
static HLIST_HEAD(console_list);

#define console_first()				\
    hlist_entry(console_list.first, struct console, node)

static void try_enable_default_console(struct console *newcon)
{
    if (newcon->setup)
    {
        newcon->setup(newcon, "");
    }
}

void register_console(struct console *newcon)
{
    if (preferred_console < 0)
    {
        try_enable_default_console(newcon);
    }

    hlist_add_head_rcu(&newcon->node, &console_list);
}

int vprintk_default(const char *fmt, va_list args)
{
    struct console *con;
    int n = 0;
    char buf[81];

    con = console_first();

    if (con)
    {
        n = vsnprintf(buf, sizeof(buf), fmt, args);

        con->write(con, buf, n);
    }

    return n;
}

int _printk(const char *fmt, ...)
{
    va_list args;
    int r;

    va_start(args, fmt);
    r = vprintk_default(fmt, args);
    va_end(args);

    return r;
}
